#include<iostream>
#include<stack>

using namespace std;


template<class T>//这里使用了模板类那么当使用ListNode类的时候就需要在后面加上<>用于指明其中的class T. 
class ListNode{
	private:
		T data;
		ListNode<T>* next = NULL;
	public:
		void setData(T a){
			data = a;
		}
		
		T getData(){
			return data;
		}
		
		void setNext(ListNode<T>* n){
			next = n;
		}
		ListNode<T>* getNext(){
			return next;
		}
		
};

template<class T>//
class MyList{
	private:
		ListNode<T>* head = NULL;//(使用NULL是为了防止出现野指针错误)这里使用了模板类的嵌套将ListNode的模板类交由List进行管理。 
		int length;
	public:
		void createList(T arr[], int len){
			this->length = len;//初始化长度属性 
			cout<<"length:"<<length<<endl;
			int i = 0;
//			cout << "arr[0]: "<<arr[0]<<endl;
//			cout<<"value:"<<head->getData();//错误：head还没有分配空间初始化，就直接使用 
			ListNode<T>* tear = new ListNode<T>();//用于指向尾部的节点 
			tear->setData(arr[i++]); //此时head为NULL没有分配内存空间这样会报错溢出 
			head = tear;
//			tear = head;//tear从头部开始向后遍历 
//			cout<<"value:"<<tear->getData();
			
			
			while (i < len){//tear从头部开始向后遍历 ------尾插法 
				ListNode<T>* newNode = new ListNode<T>();//创造新的挂载节点 
				newNode->setData(arr[i++]);
//				cout<<"value:"<<tear->getData()<<" ";
				tear->setNext(newNode); //将新产生的节点挂到队列的尾部 
				tear = newNode;//tear重新定位到最后的新节点上 
				
			}
		}
		
		void show(){
			int i = 0;
			ListNode<T>* p = this->head;
			
			while (p != NULL){
				cout<<"list"<<i++<<": "<<p->getData()<<" ";
				p = p->getNext();
			}
		}
		
		bool isempty(){
			return length > 0;
		} 
		
		int lengthOfList(){
			return length;
		}
		
		void reverse(){//使用栈转置链表 新建一个链表 
			ListNode<T>* tear = this->head; 
			this->head = tear;//头结点初始化 
			ListNode<T>* p = this->head;
			stack<T> helpStk;
			while (p != NULL){
				helpStk.push(p->getData());
				p = p->getNext();
			}
			while (!helpStk.empty()){//tear从头部开始向后遍历 ------尾插法 
				ListNode<T>* newNode = new ListNode<T>();
				newNode->setData(helpStk.top());
				helpStk.pop();
				tear->setNext(newNode);
				tear = tear->getNext();
			}
			cout<<"\n"<<"reverse List:";
			show();
		}
		
		void reverse1(){//使用头插法转置链表 
		
		} 
};

int main(){
	int arr[] = {1,3,5,2,8,6,4,3};
	int len = sizeof(arr)/sizeof(unsigned(short int));
	int len1 = sizeof(arr)/sizeof(short int);
//	cout<<"len:"<<len<<" len1:"<<len1<<endl;
//	ListNode<int>* tear = new ListNode<int>();
	MyList<int>* root = new MyList<int>();
	int len2 = sizeof(arr)/sizeof(arr[0]);
	
	cout<<"len2:"<<len2<<endl;
	root->createList(arr, len2);
	root->show();
	root->reverse();
	

//	for (int i = 0; ;i++ ){//不可以识别出int数组的长度，（找到int数组的结尾特征） 
//		if (arr[i]%1  != 0){
//			cout <<"length:" << i<< endl; 
//		}
//		cout<<"i: "<<arr[i]<<endl;
//	}
	return 0;
}